package controllers

import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import play.api.libs.ws._
import models._
import scala.xml._
import services._

object Pesquisadores extends Controller {

  def index = Action{ implicit request =>
    Ok(views.html.pesquisadores.index(PesquisadorService.list()))
  }
  
  def novo = Action{
    Ok(views.html.pesquisadores.cadastrar(pesquisadorForm, InstituicaoService.list().map(i => i.id.get.toString -> i.nome)))
  }
  
  def cadastrar = Action{ implicit request =>
    pesquisadorForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.pesquisadores.cadastrar(formError, InstituicaoService.list().map(i => i.id.get.toString -> i.nome)))},
      pesquisador => {
        PesquisadorService.create(pesquisador)
        Redirect(routes.Pesquisadores.index).flashing(("success","Pesquisador Cadastrada com Sucesso"))
      }
    )
  }
  
  def editar(pesquisadorId: Int) = Action {
    val pesquisador = PesquisadorService.getById(pesquisadorId)
    Ok(views.html.pesquisadores.editar(pesquisadorForm.fill(pesquisador), InstituicaoService.list().map(i => i.id.get.toString -> i.nome)))
  }
  
  def atualizar(pesquisadorId: Int) = Action { implicit request =>
      pesquisadorForm.bindFromRequest.fold(
      formError => {BadRequest(views.html.pesquisadores.editar(formError, InstituicaoService.list().map(i => i.id.get.toString -> i.nome)))},
      pesquisador => {
        PesquisadorService.update(pesquisador)
        Redirect(routes.Pesquisadores.index).flashing(("success","Pesquisador Atualizada com Sucesso"))
      }
    )
  }
  
  def excluir(pesquisadorId: Int) = Action{
    PesquisadorService.delete(pesquisadorId)
    Redirect(routes.Pesquisadores.index).flashing(("success","Pesquisador Excluido com Sucesso"))
  }
  
  val pesquisadorForm = Form(
	mapping(
	  "id" -> optional(number),
      "nome" -> nonEmptyText,
      "email" -> email,
      "usuario" -> mapping(
        "login" -> nonEmptyText,
        "senha" -> nonEmptyText(6, 18)
      )(Usuario.apply)(Usuario.unapply),
      "idInstituicao" -> number,
      "telefones" -> list(
          mapping(
              "id" -> optional(number),
              "numero" -> text
          )(Telefone.apply)(Telefone.unapply)
      )
	)((id, nome, email, usuario, idInstituicao, telefones) => Pesquisador(id, nome, email, usuario, InstituicaoService.getById(idInstituicao), telefones))
	((p: Pesquisador) => Some(p.id, p.nome, p.email, p.usuario, p.instituicao.id.get, p.telefones))
	)
	
}